//#include <stdio.h>
//#include <string.h>
//
//#define max(a, b) ((a) > (b) ? (a) : (b))
//
//int main() 
//{
//    int T;
//    scanf_s("%d", &T);
//    while (T--) 
//    {
//        int n, m;
//        scanf_s("%d %d", &n, &m);
//        int w[n], v[n];
//        for (int i = 0; i < n; i++)
//        {
//            scanf_s("%d %d", &w[i], &v[i]);
//        }
//        int dp[m + 1];
//        memset(dp, 0, sizeof(dp));
//        for (int i = 0; i < n; i++) 
//        {
//            for (int j = w[i]; j <= m; j++) 
//            {
//                dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
//            }
//        }
//        printf("%d\n", dp[m]);
//    }
//    return 0;
//}

//#include <stdio.h>
//#include <string.h>
//
//#define max(a, b) ((a) > (b) ? (a) : (b))
//
//int main()
//{
//    int T;
//    scanf_s("%d", &T);
//    while (T--) 
//    {
//        int n, m;
//        scanf_s("%d %d", &n, &m);
//        int base = 0;
//        int dp[m + 1];
//        memset(dp, 0, sizeof(dp));
//        for (int i = 0; i < n; i++) 
//        {
//            int w, v, s;
//            scanf_s("%d %d %d", &w, &v, &s);
//            if (w == 0) 
//            {
//                base += v * s;
//            }
//            else 
//            {
//                int cnt = s;
//                for (int k = 1; k <= cnt; k *= 2) 
//                {
//                    int nw = w * k;
//                    int nv = v * k;
//                    if (nw > m) break;
//                    for (int j = m; j >= nw; j--)
//                    {
//                        dp[j] = max(dp[j], dp[j - nw] + nv);
//                    }
//                    cnt -= k;
//                }
//                if (cnt > 0) 
//                {
//                    int nw = w * cnt;
//                    int nv = v * cnt;
//                    if (nw <= m)
//                    {
//                        for (int j = m; j >= nw; j--)
//                        {
//                            dp[j] = max(dp[j], dp[j - nw] + nv);
//                        }
//                    }
//                }
//            }
//        }
//        printf("%d\n", dp[m] + base);
//    }
//    return 0;
//}

#include <stdio.h>
#include <string.h>

#define MAXT 500
#define MAXH 500
#define MAXN 50

long long dp[2][MAXT + 1][MAXH + 1];  

int main(void)
{
    int n, T, H;
    if (scanf_s("%d", &n) != 1) return 0;
    scanf_s("%d %d", &T, &H);

    int t[MAXN], h[MAXN];
    long long a[MAXN];
    for (int i = 0; i < n; ++i)
        scanf_s("%d %d %lld", &t[i], &h[i], &a[i]);

    memset(dp, -1, sizeof(dp));
    dp[0][0][0] = 0;

    int cur = 0;
    for (int i = 0; i < n; ++i)   
    {
        int nxt = cur ^ 1;
        memset(dp[nxt], -1, sizeof(dp[nxt]));

        for (int tt = 0; tt <= T; ++tt)
            for (int hh = 0; hh <= H; ++hh)
                if (dp[cur][tt][hh] != -1)
                {
                    if (dp[nxt][tt][hh] < dp[cur][tt][hh])
                        dp[nxt][tt][hh] = dp[cur][tt][hh];

                    int nt = tt + t[i];
                    int nh = hh + h[i];
                    if (nt <= T && nh <= H)
                    {
                        long long nv = dp[cur][tt][hh] + a[i];
                        if (dp[nxt][nt][nh] < nv)
                            dp[nxt][nt][nh] = nv;
                    }
                }
        cur = nxt;
    }

    long long ans = 0;
    for (int tt = 0; tt <= T; ++tt)
        for (int hh = 0; hh <= H; ++hh)
            if (dp[cur][tt][hh] > ans)
                ans = dp[cur][tt][hh];

    printf("%lld\n", ans);
    return 0;
}